package model.prestamos.estado;

import static org.junit.Assert.*;
import model.prestamos.Prestamo;

import org.junit.Test;

import excepciones.prestamos.NoSePuedeAprobarPrestamoException;
import excepciones.prestamos.NoSePuedeCobrarCuotaException;
import excepciones.prestamos.NoSePuedePasarPrestamoADeudorIncobrableException;
import excepciones.prestamos.NoSePuedePasarPrestamoAEnDeudaException;
import excepciones.prestamos.NoSePuedeRechazarPrestamoException;
import static org.mockito.Mockito.*;

/**
 * @author Lucas
 */
public class PrestamoFinalizadoTest {

	private Finalizado prestamoFinalizado = new Finalizado();
	private Prestamo prestamoMock = mock(Prestamo.class);
	
	
	/**
	 * Verifica que un prestamo finalizado no se puede aprobar  
	 * @throws NoSePuedeAprobarPrestamoException
	 */
	@Test(expected=NoSePuedeAprobarPrestamoException.class)
	public void testNoSePuedeAprobarPrestamoFinalizado() throws NoSePuedeAprobarPrestamoException{
		prestamoFinalizado.aprobar(prestamoMock);
	}
	
	/**
	 * Verifica que un prestamo finalizado no se puede rechazar
	 * @throws NoSePuedeRechazarPrestamoException
	 */
	@Test(expected=NoSePuedeRechazarPrestamoException.class)
	public void testNoSePuedeRechazarPrestamoFinalizado() throws NoSePuedeRechazarPrestamoException{
		prestamoFinalizado.rechazar(prestamoMock, "motivo cualquiera");
	}
	
	
	/** Verifica que no se puede cobrar la cuota de un prestamo finalizado 
	 * @throws NoSePuedeCobrarCuotaException */
	@Test(expected=NoSePuedeCobrarCuotaException.class)
	public void testNoSePuedeCobrarCuota() throws NoSePuedeCobrarCuotaException{
		prestamoFinalizado.cobrarCuota(prestamoMock);
	}
	
	/** Verifica que un prestamo finalizado no puede pasarse a En Deuda 
	 * @throws NoSePuedePasarPrestamoAEnDeudaException */
	@Test(expected=NoSePuedePasarPrestamoAEnDeudaException.class)
	public void testNoSePuedePasarPrestamoAEnDeuda() throws NoSePuedePasarPrestamoAEnDeudaException{
		prestamoFinalizado.pasarPrestamoAEnDeuda(prestamoMock);
	}
	
	/** Verifica que un prestamo finalizado no puede pasarse a Deuda incobrable 
	 * @throws NoSePuedePasarPrestamoADeudorIncobrableException */
	@Test(expected=NoSePuedePasarPrestamoADeudorIncobrableException.class)
	public void testNoSePuedePasarPrestamoDeFinalizadoAEnDeudaIncobrable() throws NoSePuedePasarPrestamoADeudorIncobrableException{
		prestamoFinalizado.pasarPrestamoADeudorIncobrable(prestamoMock);
	}
	
	/** Verifica que el prestamo no esta solicitado */
	@Test
	public void testPrestamoNoEsSolicitado(){
		assertFalse(prestamoFinalizado.estaSolicitado());
	}
	
	/** Verifica que el prestamo no esta en curso */
	@Test
	public void testPrestamoEstaEnCurso(){
		assertFalse(prestamoFinalizado.estaEnCurso());
	}
	
	/** Verifica que el prestamo no esta en deuda */
	@Test
	public void testPrestamoNoEstaEnDeuda(){
		assertFalse(prestamoFinalizado.estaEnDeuda());
	}
	
	/** Verifica que el prestamo no esta en deuda incobrable */
	@Test
	public void testPrestamoNoEstaEnDeudaIncobrable() {
		assertFalse(prestamoFinalizado.estaEnDeudaIncobrable());
	}
	
	/** Verifica que el prestamo esta finalizado */
	@Test
	public void testPrestamoEstaFinalizado() {
		assertTrue(prestamoFinalizado.estaFinalizado());
	}

	/** Verifica que el prestamo no esta rechazado */
	@Test
	public void testPrestamoNoEstaRechazado() {
		assertFalse(prestamoFinalizado.estaRechazado());
	}
	
	/** Verifica que un prestamo finalizado no adeuda cuotas */
	@Test
	public void testPrestamoFinalizadoNoAdeudaCuotas(){
		assertFalse(prestamoFinalizado.adeudaCuotas(prestamoMock));
	}
	
	@Test
	public void testPrestamoFinalizadoNoEstaActivo(){
		assertFalse(this.prestamoFinalizado.estaActivo());
	}
}
